"""数据工具路由 - 提供数据获取、分析和导出功能"""

from fastapi import APIRouter, HTTPException, Depends
from fastapi.responses import StreamingResponse
from typing import Dict, Any, Optional, List
from pydantic import BaseModel
from datetime import datetime
from loguru import logger

from backend.services.data_analysis import data_analysis_service


router = APIRouter(
    prefix="/v1/data",
    tags=["数据工具"],
    responses={404: {"description": "Not found"}}
)


class FetchAnalyzeRequest(BaseModel):
    """获取和分析数据的请求模型"""
    url: str
    headers: Optional[Dict[str, str]] = None
    params: Optional[Dict[str, Any]] = None
    body: Optional[Dict[str, Any]] = None
    method: str = "GET"
    json_path: Optional[str] = None
    group_by: Optional[str] = None
    date_field: Optional[str] = None
    freq: Optional[str] = None  # day, week, month
    value_field: Optional[str] = None
    agg: str = "count"  # count, sum, mean, max, min


class ExportExcelRequest(BaseModel):
    """导出Excel的请求模型"""
    data: List[Dict[str, Any]]
    columns: Optional[List[str]] = None


@router.post("/fetch_analyze", summary="获取并分析数据")
async def fetch_and_analyze(request: FetchAnalyzeRequest) -> Dict[str, Any]:
    """
    从外部API获取数据并进行分析
    
    - **url**: 外部API地址
    - **headers**: 请求头（可选）
    - **params**: 查询参数（可选）
    - **body**: 请求体（可选，用于POST/PUT请求）
    - **method**: HTTP方法（GET, POST, PUT, DELETE），默认为GET
    - **json_path**: 从响应中提取数据的路径，支持点号分隔（如 'data.items'）
    - **group_by**: 分组字段名（可选）
    - **date_field**: 日期字段名（可选）
    - **freq**: 日期聚合频率（可选，如 'day', 'week', 'month'）
    - **value_field**: 聚合的值字段（可选）
    - **agg**: 聚合方法（count, sum, mean, max, min），默认为count
    
    示例：
    - 获取并分析产品数据：
      - url: https://dummyjson.com/products
      - json_path: products
      - group_by: category
      - value_field: price
      - agg: sum
    
    - 获取并按日期分析数据：
      - url: https://api.example.com/transactions
      - json_path: data
      - date_field: created_at
      - freq: day
      - agg: count
    """
    try:
        logger.info(f"接收到数据获取分析请求: {request.url}")
        
        # 1. 获取原始数据
        raw_data = data_analysis_service.fetch_data(
            url=request.url,
            headers=request.headers,
            params=request.params,
            body=request.body,
            method=request.method
        )
        
        # 2. 提取指定路径的数据
        extracted_data = data_analysis_service.extract_data_from_json_path(
            data=raw_data,
            json_path=request.json_path
        )
        
        # 3. 创建DataFrame
        df = data_analysis_service.create_dataframe(extracted_data)
        
        # 4. 解析日期（如果需要）
        if request.date_field:
            df = data_analysis_service.parse_dates(df, request.date_field)
        
        # 5. 分析数据
        analysis_result = data_analysis_service.analyze_data(
            df=df,
            group_by=request.group_by,
            date_field=request.date_field,
            freq=request.freq,
            value_field=request.value_field,
            agg=request.agg
        )
        
        # 6. 返回完整结果
        result = {
            "status": "success",
            "timestamp": datetime.now().isoformat(),
            "request_info": {
                "url": request.url,
                "json_path": request.json_path,
                "analysis_params": {
                    "group_by": request.group_by,
                    "date_field": request.date_field,
                    "freq": request.freq,
                    "value_field": request.value_field,
                    "agg": request.agg
                }
            },
            "analysis": analysis_result,
            "full_data": extracted_data  # 返回原始数据供前端使用
        }
        
        logger.info(f"数据获取分析完成: {request.url}")
        return result
        
    except Exception as e:
        logger.error(f"数据获取分析失败: {str(e)}")
        raise HTTPException(status_code=400, detail=str(e))


@router.post("/export_excel", summary="导出Excel")
async def export_excel(request: ExportExcelRequest) -> StreamingResponse:
    """
    将数据导出为Excel文件
    
    - **data**: 要导出的数据列表
    - **columns**: 要导出的列（可选，默认导出所有列）
    
    返回一个Excel文件，包含两个工作表：
    - 数据：原始数据
    - 统计信息：各字段的统计数据
    """
    try:
        logger.info(f"接收到Excel导出请求，共 {len(request.data)} 条数据")
        
        # 创建DataFrame
        df = data_analysis_service.create_dataframe(request.data)
        
        # 如果指定了列，则只导出这些列
        if request.columns:
            valid_columns = [col for col in request.columns if col in df.columns]
            df = df[valid_columns]
        
        # 导出为Excel
        excel_bytes = data_analysis_service.export_to_excel(df)
        
        # 返回文件流
        return StreamingResponse(
            iter([excel_bytes]),
            media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            headers={
                "Content-Disposition": f"attachment; filename=data_export_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
            }
        )
        
    except Exception as e:
        logger.error(f"Excel导出失败: {str(e)}")
        raise HTTPException(status_code=400, detail=str(e))


__all__ = ["router"]